package com.dao;

import com.bean.Post;
import com.utils.DBHelper;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.math.BigDecimal;
import java.sql.Connection;
import java.util.List;

public class PostDao {
    /**
     * 添加文章方法
     * @param post 要插入的文章
     * @return  带 id 的文章
     * @throws Exception
     */
    public Post addPost(Post post) throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句
        String sql = "insert into post (title, content, author) values (?, ?, ?)";
        System.out.println("添加的语句是：" + sql);

        // 用数组获取参数
        Object[] params = {
                post.getTitle(),
                post.getContent(),
                post.getAuthor(),
        };
        try {
            // 创建对象
            QueryRunner runner = new QueryRunner();
            // 调用方法，做添加是一般用 ScalarHandler
            BigDecimal bigDecimal = runner.insert(conn, sql, new ScalarHandler<>(), params);
            // 获取 post 中的 id
            post.setId(bigDecimal.longValue());
            // 返回对象
            return post;
        } finally {
            // 关闭连接，释放资源
            // 一定要记得这一步
            DbUtils.closeQuietly(conn);
        }
    }

    /**
     * 删除方法
     * @param id 要删除的参数
     * @throws Exception
     */
    public void delPost(int id) throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句
        String sql = "delete from post where id = ?";
        System.out.println("删除的语句是：" + sql);

        try {
            // 创建连接并调用方法
            new QueryRunner().update(conn, sql, id);
        } finally {
            // 关闭连接，释放资源
            DbUtils.closeQuietly(conn);
        }
    }

    /**
     * 查询所有信息方法
     * @return  所有的 Posts
     * @throws Exception
     */
    public List<Post> getAll() throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句，并按照时间排序
        String sql = "select id, title, content, author, created from post order by created desc";
        System.out.println("查询的语句是：" + sql);

        try {
            // 创建对象并调用方法
            // 查询多条记录要使用 BeanListHandler
            return new QueryRunner().query(
                    conn, sql, new BeanListHandler<>(Post.class)
            );
        } finally {
            // 关闭连接，释放资源
            DbUtils.closeQuietly(conn);
        }
    }

    /**
     * 查询某篇文章方法
     * @param id Post 的主键
     * @return
     * @throws Exception
     */
    public Post getPostById(int id) throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句
        String sql = "select id, title, content, author, created from post where id = ?";
        System.out.println("查询单条记录的语句是：" + sql);

        try {
            // 创建对象并调用方法
            // 查询单条语句使用 BeanHandler
            return new QueryRunner().query(
                    conn, sql, new BeanHandler<>(Post.class), id
            );
        } finally {
            // 关闭连接，释放资源
            DbUtils.closeQuietly(conn);
        }
    }
}
